/********************************************************************************
 公共方法库
 *******************************************************************************/
var G_Prg = new yingSoftPre();
function yingSoftPre() {
}

/********************************************************************************
 函数名：alert(必须引用dialog.css和dialog.js)
 功能：自定义弹出框
 输入参数: msg 提示信息
 callback 点击后执行的函数(可选参数)
 返回值：无
 创建信息：黎萍（2014-05-20）
 修改记录：谢建沅（2014-06-13）封装弹出窗口
 修改记录：谢建沅（2014-06-18）添加回调函数
 修改记录：韦友爱（2014-10-23）添加是否有报错弹窗的判断
            韦友爱（2015-07-13）有回调时，改调用G_DialogBox.alert
 审查人：韦友爱（2010-05-26）
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
yingSoftPre.prototype.alert = function (msg, callback) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
        if (callback) {
            /*G_DialogBox.alert(msg,function(btn){
                if (btn === 'yes') {
                    callback();
                }
            });*/
            G_DialogBox.show({ buttons: { yes: '确认' }, width: '300px', msg: msg, title: '温馨提示', fn: function (btn) {
                if (btn === 'yes') {
                    callback();
                }
            } });
        } else {
            G_DialogBox.alert(msg);
        }
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

/********************************************************************************
 函数名：confirm(必须引用dialog.css和dialog.js)
 功能：自定义确认框
 输入参数: msg 提示信息
 callback 确认后的回调函数
 返回值：无
 创建信息：谢建沅（2014-06-13）封装确认框
 修改记录：韦友爱（2014-10-23）添加是否有报错弹窗的判断
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
yingSoftPre.prototype.confirm = function (msg, yesCallback, noCallback) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
        G_DialogBox.confirm(msg, function (btn) {
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback();
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

/********************************************************************************
 函数名：confirmTY(必须引用dialog.css和dialog.js)
 功能：自定义确认框
 输入参数: msg 提示信息
 callback 确认后的回调函数
 返回值：无
 *******************************************************************************/
yingSoftPre.prototype.confirmTY = function (msg,ymsg,nmsg, yesCallback, noCallback) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
        G_DialogBox.confirmTY(msg,ymsg,nmsg, function (btn) {
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback();
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

yingSoftPre.prototype.confirmReg = function (msg, yesCallback, noCallback) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
        G_DialogBox.confirmReg(msg, function (btn) {
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback();
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

/********************************************************************************
 函数名：textarea(必须引用dialog.css和dialog.js)
 功能：笔记编辑框
 输入参数: msg 显示时绑定的文本
 callback 确认后的回调函数
 返回值：无
 创建信息：谢建沅（2014-06-13）封装确认框
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
yingSoftPre.prototype.textarea = function (msg, yesCallback, noCallback) {
    try {
        G_DialogTextarea.textarea(msg, function (btn, text) {
            if (text) {
                text = text.replace(/[\ud83c-\udfff]/g, '');
            }
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback(text);
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

yingSoftPre.prototype.pwdTextBox = function (msg, yesCallback, noCallback) {
    try {
        G_DialogTextarea.pwdTextBox(msg, function (btn, text) {
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback(text);
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

/********************************************************************************
 函数名：htmlContent(必须引用dialog.css和dialog.js)
 功能：显示html的弹出框
 输入参数: width 弹出框宽度 '300px'或'90%'
 height 弹出框高度 '300px'或'90%'
 title  标题
 html   显示的html代码
 isInnerHtml true:使用innerHTML方式，false:使用appendChild方式
 closeCallback  关闭回调函数
 返回值：无
 创建信息：谢建沅（2014-06-13）
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
yingSoftPre.prototype.htmlContent = function (width, height, title, html, isInnerHtml, closeCallback) {
    try {
        //隐藏背景滚动条
        document.body.style.overflow = 'hidden';
        G_DialogContent.htmlContent(width, height, title, html, isInnerHtml, function () {
            if (closeCallback) {
                closeCallback();
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

/********************************************************************************
 函数名：popMsg
 功能：弹出提示文本
 输入参数: msg 显示的文本
 返回值：无
 创建信息：谢建沅（2014-07-28）
 审查人：
 *******************************************************************************/
yingSoftPre.prototype.popMsgTimer = null;//setTimeout定时器
yingSoftPre.prototype.popMsg = function (msg,showTime,isCenter) {
    showTime = showTime || 1000;
    if(this.popMsgTimer){
        clearTimeout(this.popMsgTimer);
    }
    var oldPopdialog = document.getElementById('popMsgDiv');
    if(oldPopdialog){
        document.body.removeChild(oldPopdialog);
    }
    var popDiv = document.createElement("div");
    popDiv.id = 'popMsgDiv';
    popDiv.style.position = 'fixed';
    popDiv.style.width = '180px';
    popDiv.style.backgroundColor = '#000';
    if(isCenter){
        popDiv.style.top = '50%';
        //popDiv.style.marginTop = '0px';
    } else{
        popDiv.style.bottom = '50px';
    }
    //popDiv.style.filter = 'alpha(opacity=80)';
    popDiv.style.opacity = 0.8;
    popDiv.style.color = '#FFF';
    popDiv.style.fontSize = '16px';
    popDiv.style.borderRadius = '5px';
    popDiv.style.left = '50%';
    popDiv.style.zIndex = 9999;
    popDiv.style.marginLeft = '-100px';
    popDiv.style.padding = '5px 10px 5px 10px';
    popDiv.style.textAlign = 'center';

    popDiv.innerHTML=msg;

    document.body.appendChild(popDiv);

    this.popMsgTimer = setTimeout(function(){
        var popdialog = document.getElementById('popMsgDiv');
        if(popdialog){
            document.body.removeChild(popdialog);
        }
    },showTime);

}

/********************************************************************************
 函数名：popMsgDialog
 功能：弹出居中提示文本框
 输入参数: msg 显示的文本
 返回值：无
 创建信息：谢建沅（2014-07-28）
 审查人：
 *******************************************************************************/
yingSoftPre.prototype.popMsgDialog = function (msg) {
    try {
        G_DialogPop.popMsg(msg);
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}

/********************************************************************************
 函数名：throw
 功能：抛出异常
 输入参数: msg 异常信息
 返回值：无
 创建信息：黎萍（2014-05-20）
 修改记录：无
 审查人：韦友爱（2010-05-26）
 *******************************************************************************/
yingSoftPre.prototype.throw = function (msg, callback) {
    this.alert(msg, function(){
        if(callback){
            callback();
        } else{
            window.location.href = '/doExam-index';
        }
        });
    throw new Error(msg);
}
/********************************************************************************
 函数名：$
 功能：JS封装document.getElementById(id)
 输入参数: 元素ID
 返回值：标签对象
 创建信息：黎萍（2014-05-30）
 修改记录：无
 *******************************************************************************/
yingSoftPre.prototype.$ = function (id) {
    return document.getElementById(id);
}
/********************************************************************************
 函数名：GetDay
 功能：获取指定日期的前一天
 输入参数：year, month, day   年，月，日   num ：相差天数
 返回值：指定日期的前一天
 最后修改人（时间）：颜鹏（2016-11-01）
 修改内容：创建
 *******************************************************************************/

yingSoftPre.prototype.GetDay = function (year, month, day, num)
{
    var today=new Date(year, month-1 ,day);
    if(!num){
        num=1
    }
    var yesterday_milliseconds=today.getTime()-1000*60*60*24*num;

    var yesterday=new Date();
    yesterday.setTime(yesterday_milliseconds);

    var strYear=yesterday.getFullYear();
    var strDay=yesterday.getDate();
    var strMonth=yesterday.getMonth()+1;
    if(strMonth<10)
    {
        strMonth="0"+strMonth;
    }
    var strYesterday=strYear+"-"+strMonth+"-"+strDay;
    //alert(strYesterday);
    return strYesterday;
}
/********************************************************************************
 函数名：getQueryString
 功能：获取参数值
 输入参数: name 参数名
 isURLEncode 是否用了URL字符编码
 返回值：string 参数值
 创建信息：谢建沅(2014-5-30)
 修改记录：无
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
//yingSoftPre.prototype.getQueryString = function (name, isURLEncode) {
//  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
//  var value = window.location.search.substr(1).match(reg);
//  if (!value) {
//      return null;
//  }
//  if (isURLEncode) {
//      return decodeURI(value[2]);
//  } else {
//      return unescape(value[2]);
//  }
//
//}
yingSoftPre.prototype.getQueryString = function (name, isURLEncode) {
    var str=window.location.search.substr(1).replace(new RegExp('{sp}', 'g'), '&');
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    var value = str.match(reg);
    if (!value) {
        return null;
    }
    if (isURLEncode) {
        return decodeURI(value[2]);
    } else {
        return unescape(value[2]);
    }

}
//将URL中的UTF-8字符串转成中文字符串
/********************************************************************************
 函数名：getCharFromUtf8
 功能：将URL中的UTF-8字符串转成中文字符串
 输入参数: str 参数名称
 返回值：str 中文字符串
 创建信息：欧聪（2014-11-21）
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.getCharFromUtf8=function (str) {
    var cstr = "";
    var nOffset = 0;
    if (str == "")
        return "";
    str = str.toLowerCase();
    nOffset = str.indexOf("%e");
    if (nOffset == -1)
        return str;
    while (nOffset != -1) {
        cstr += str.substr(0, nOffset);
        str = str.substr(nOffset, str.length - nOffset);
        if (str == "" || str.length < 9)
            return cstr;
        cstr += yingSoftPre.prototype.utf8ToChar(str.substr(0, 9));
        str = str.substr(9, str.length - 9);
        nOffset = str.indexOf("%e");
    }
    return cstr + str;
}
/********************************************************************************
 函数名：getSoftMenuData
 功能：获取目录科目信息
 修改记录：无
 审查人：无
 **********************************************************************/
yingSoftPre.prototype.getSoftMenuData=function() {
	var softMenuJson = null;
	var agentCode = 9020;
	if(sessionStorage.getItem('data_data')){
		var data = sessionStorage.getItem('data_data');
		softMenuJson = {
			'AppEName': "yixuegaojidabian",
			'Childs': [],
			'Name': "医学高级答辩"
		}
		softMenuJson.Childs = JSON.parse(data).Childs[0].Childs;

		return softMenuJson;
	}
	var _success = function(json) {
		var jsonData = JSON.parse(json);
		//服务器返回的数据json的格式为：{ data:{"GenDate": "2014-06-18", "Childs": [{"Childs": [...], "AppEName": AppEName, "Name": Name}]},msg:msg,status:200}
		if(jsonData.status === 200) {
			//接收数据
			var data = jsonData.data;
			//存入sessionStorage
			softMenuJson = {
				'AppEName': "yixuegaojidabian",
				'Childs': [],
				'Name': "医学高级答辩"
			}
			softMenuJson.Childs = JSON.parse(data).Childs[0].Childs;

			sessionStorage.setItem('data_data', data);

			//公共变量接收软件目录json数据
		} else if(jsonData.status === 300) {
			G_Prg.throw('程序运行错误，softMenu.loadSoftMenu,数据库获取数据异常');
		} else if(jsonData.status >= 400 && jsonData.status < 500) {} else {
			G_Prg.throw('抱歉，不能处理，softMenu.loadSoftMenu:json="' + json + '"！');
		}
	}
	G_AjaxApi_Menu.get('/api/softMenu/getNew?agentCode=' + agentCode, false, _success);
	return softMenuJson;
}
/********************************************************************************
 函数名：getSoftMenuData
 功能：获取目录科目信息
 修改记录：无
 审查人：无
 **********************************************************************/
function _getAppMenuData(agentCodes) {
        var softMenuJson = null;
        var agentCode;
        if(agentCodes == '888'){
         agentCode = '888';
         if (sessionStorage.getItem('AppMenuData')) {
           var data = sessionStorage.getItem('AppMenuData');
         }
        }else{
         agentCode = agentCodes;
         if (sessionStorage.getItem(agentCode + '_AppMenuData')) {
           var data = sessionStorage.getItem(agentCode+'_AppMenuData');
         }
        }
        if (data) {
          if($('.switchTit .rt').hasClass('act')){
            $('.loadingDiv').hide();
          }
          softMenuJson = JSON.parse(data);
          return softMenuJson;
        }
        var _success = function(json) {
          $('.loadingDiv').hide();
          var jsonData = JSON.parse(json);
          //服务器返回的数据json的格式为：{ data:{"GenDate": "2014-06-18", "Childs": [{"Childs": [...], "AppEName": AppEName, "Name": Name}]},msg:msg,status:200}
          if (jsonData.status === 200) {
            //接收数据
            var data = jsonData.data;
            softMenuJson = JSON.parse(data);
            if(agentCode == '888'){
              sessionStorage.setItem('AppMenuData', JSON.stringify(softMenuJson));
            } else {
              //存入sessionStorage               
              sessionStorage.setItem(agentCode+'_AppMenuData', JSON.stringify(softMenuJson));
              //公共变量接收软件目录json数据
            }
          } else if (jsonData.status === 300) {
            G_Prg.
            throw ('程序运行错误，softMenu.loadSoftMenu,数据库获取数据异常');
          } else if (jsonData.status >= 400 && jsonData.status < 500) {} else {
            G_Prg.
            throw ('抱歉，不能处理，softMenu.loadSoftMenu:json="' + json + '"！');
          }
        }
        G_AjaxApi_Menu.get('/api/softMenu/getNew?agentCode=' + agentCode, false, _success);
        return softMenuJson;
}
//将编码转换成字符
/********************************************************************************
 函数名：utf8ToChar
 功能：将编码转换成字符
 输入参数: str 参数名称
 返回值：str 字符
 创建信息：欧聪（2014-11-21）
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.utf8ToChar=function (str) {
    var iCode, iCode1, iCode2;
    iCode = parseInt("0x" + str.substr(1, 2));
    iCode1 = parseInt("0x" + str.substr(4, 2));
    iCode2 = parseInt("0x" + str.substr(7, 2));
    return String.fromCharCode(((iCode & 0x0F) << 12) | ((iCode1 & 0x3F) << 6) | (iCode2 & 0x3F));
}
/********************************************************************************
 函数名：checkParamName
 功能：检查参数名称是否存在
 输入参数: paramName 参数名称
 返回值：bool 是或否
 创建信息：谢建沅(2014-06-13)
 修改记录：黎萍（2014-06-13）修改函数名称和变量名称
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
yingSoftPre.prototype.checkParamName = function (paramName) {
    var paramStr = window.location.search.substr(1);
    var paramArr = paramStr.split('&');
    for (var i = 0; i < paramArr.length; i++) {
        if (paramName === paramArr[i].split('=')[0]) {
            return true;
        }
    }
    return false;
}
/********************************************************************************
 函数名：getBrowserVersion
 功能：获取浏览器类型和版本号
 输入参数: 无
 返回值：string 浏览器名称和版本（空格分隔开）
 创建信息：谢建沅(2014-5-30)
 修改记录：无
 审查人：谭健康（2014-06-01）
 *******************************************************************************/
yingSoftPre.prototype.getBrowserVersion = function () {
            var browser = {};
            var userAgent = navigator.userAgent.toLowerCase();
            var verString;
            (verString = userAgent.match(/msie ([\d.]+)/))
                ? browser.ie = verString[1]
                : (verString = userAgent.match(/firefox\/([\d.]+)/))
                ? browser.firefox = verString[1]
                : (verString = userAgent.match(/chrome\/([\d.]+)/))
                ? browser.chrome = verString[1]
                : (verString = userAgent.match(/ucbrowser.([\d.]+)/))
                ? browser.uc = verString[1]
                : (verString = userAgent.match(/baidubrowser.([\d.]+)/))
                ? browser.baidu = verString[1]
                : (verString = userAgent.match(/opera.([\d.]+)/))
                ? browser.opera = verString[1]
                : (verString = userAgent
                .match(/version\/([\d.]+).*safari/))
                ? browser.safari = verString[1]
                : 0;

            var version = '';
            if (browser.ie) {
                version = 'msie ' + browser.ie;
            } else if (browser.firefox) {
                version = 'firefox ' + browser.firefox;
            } else if (browser.chrome) {
                version = 'chrome ' + browser.chrome;
            } else if (browser.uc) {
                version = 'uc ' + browser.uc;
            } else if (browser.baidu) {
                version = 'baidu ' + browser.baidu;
            } else if (browser.opera) {
                version = 'opera ' + browser.opera;
            } else if (browser.safari) {
                version = 'safari ' + browser.safari;
            } else {
                version = 'unknown';
            }
            //处理android自带浏览器
            var adIndex = userAgent.indexOf('android');
            if(adIndex > -1 && browser.safari){
                var adEndIndex = userAgent.indexOf(';',adIndex);
                version = userAgent.substring(adIndex,adEndIndex);
            }
            return version;
}
/********************************************************************************
 函数名：checkEmail
 功能：验证Email格式
 输入参数: emailStr 待验证字符串
 返回值：true 验证通过 false验证不通过
 创建信息：谢建沅(2014-5-30)
 修改记录：黎萍（2014-06-24）修改变量名称
 审查人：谭健康reg.test(str)正则检查短字符串没问题（2014-06-01）
 *******************************************************************************/
yingSoftPre.prototype.checkEmail = function (emailStr) {
    if (emailStr.length !== 0) {
        var emailReg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
        return emailReg.test(emailStr);
    }
}
/********************************************************************************
 函数名：checkZip
 功能：验证邮编格式
 输入参数: 待验证字符串
 返回值：true 验证通过 false验证不通过
 创建信息：谢建沅(2014-5-30)
 修改记录：黎萍（2014-06-24）修改变量名称
 审查人：谭健康（2014-06-01）
 *******************************************************************************/
yingSoftPre.prototype.checkZip = function (zipStr) {
    if (zipStr.length !== 0) {
        var zipReg = /^\d{6}$/;
        return zipReg.test(zipStr);
    }
}
/********************************************************************************
 函数名：checkUserName
 功能：验证是否为用户名a-z,A-Z,0-9
 输入参数: userName 待验证字符串
 返回值：true 验证通过 false验证不通过
 创建信息：谢建沅(2014-5-30)
 修改记录：黎萍（2014-06-24）修改变量名称
 审查人：谭健康（2014-06-01）
 *******************************************************************************/
yingSoftPre.prototype.checkUserName = function (userName) {
    if (userName.length !== 0) {
        var userNameReg = /^[a-zA-Z0-9_]+$/;
        return userNameReg.test(userName);
    }
}
/********************************************************************************
 函数名：checkNumber
 功能：验证是否为用户名0-9
 输入参数: num 待验证字符串
 返回值：true 验证通过 false验证不通过
 创建信息：谢建沅(2014-9-30)
 修改记录：
 审查人：
 *******************************************************************************/
yingSoftPre.prototype.checkNumber = function (num) {
    if (num.length !== 0) {
        var userNumReg = /^[0-9]+$/;
        return userNumReg.test(num);
    }
}
yingSoftPre.prototype.checkNumber2 = function (num) {
    if (num.length !== 0) {
//        var userNumReg = /^\d+(\d|(\.[0-9]{1,2}))$/;
//        return userNumReg.test(num);
        var result = Number(num);
        if(!isNaN(result)){
            //判断是正数并且小于20
//            if(result>=0 && result <= 20){
//                return true;
//            } else{
//                return false;
//            }
              return true;
        } else{
            return false;
        }
    }
}

/********************************************************************************
 函数名：checkCellPhone
 功能：验证是否为手机号码
 输入参数: 待验证字符串
 返回值：true 验证通过 false验证不通过
 创建信息：谢建沅(2014-06-03)
 修改记录：黎萍（2014-06-24）修改变量名称
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.checkCellPhone = function (phoneStr) {
    if (phoneStr.length !== 0) {
        //var phoneReg=/^((13[0-9])|(14[0-9])|(15[0-35-9])|(18[0,2,3,5-9]))\d{8}$/;
        var phoneReg = /^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9]))\d{8}$/;
        return phoneReg.test(phoneStr);
    }
}

/********************************************************************************
 函数名：getClientHeight
 功能：获取网页当前显示高度
 输入参数:无
 返回值：int 高度值
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.getClientHeight = function () {
    return parseInt(window.document.body.clientHeight);
}

/********************************************************************************
 函数名：getClientWidth
 功能：获取网页当前显示宽度
 输入参数:无
 返回值：int 宽度值
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.getClientWidth = function () {
    return parseInt(window.document.body.clientWidth);
}

/********************************************************************************
 函数名：checkCookieSupport
 功能：检查Cookie是否可用
 输入参数:无
 返回值：bool true可用，false不可用
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.checkCookieSupport = function () {
    var isSupport = false;
    if (navigator.cookieEnabled) {
        isSupport = true;
    } else {
        document.cookie = 'test';
        isSupport = document.cookie === 'test';
        document.cookie = '';
    }
    return isSupport;
}

/********************************************************************************
 函数名：getCookie
 功能：获取Cookie的值
 输入参数: cookieName Cookie名称
 返回值：string Cookie值
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.getCookie = function (cookieName) {
    var value = null;
    var arr;
    var reg = new RegExp("(^| )" + cookieName + "=([^;]*)(;|$)");
    arr = document.cookie.match(reg);
    if (arr) {
        value = unescape(arr[2]);
    }
    return (value) ? value : null;
}

/********************************************************************************
 函数名：setCookie
 功能：设置Cookie的值
 输入参数: name Cookie名称
 value Cookie值
 isSetTime 是否设置有效时间(可选参数),false为关闭浏览器自动删除此cookie
 返回值：无
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.setCookie = function (name, value, isSetTime) {
    if (isSetTime === undefined || isSetTime === true) {
        var day = 30;//默认cookie保存30天
        var date = new Date();
        date.setTime(date.getTime() + Number(day) * 24 * 60 * 60 * 1000);
        //document.cookie = name + "=" + escape(value) + ";domain=tibosi.com;path=/;expires = " + date.toGMTString();
        document.cookie = name + "=" + escape(value) + ";path=/;expires = " + date.toGMTString();
    }else {
        //document.cookie = name + "=" + escape(value) + ";domain=tibosi.com;path=/";
        document.cookie = name + "=" + escape(value) + ";path=/";
    }
}

/********************************************************************************
 函数名：removeCookie
 功能：删除Cookie
 输入参数: cookieName Cookie名称
 返回值：无
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.removeCookie = function (cookieName) {
    var date = new Date();
    date.setTime(date.getTime() - 10000);
    document.cookie = cookieName + "=;path=/;domain=tibosi.com;expires = " + date.toGMTString();
    document.cookie = cookieName + "=;path=/;expires = " + date.toGMTString();
}

/********************************************************************************
 函数名：cleanCookie
 功能：清除所有Cookie
 输入参数: 无
 返回值：无
 创建信息：谢建沅(2014-06-03)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.cleanCookie = function () {
    var strCookie = document.cookie;
    var arrCookie = strCookie.split('; '); // 将多cookie切割为多个名/值对
    for (var i = 0; i < arrCookie.length; i++) { // 遍历cookie数组，处理每个cookie对
        var arr = arrCookie[i].split("=");
        if (arr.length > 0) {
            this.removeCookie(arr[0]);
        }
    }
}

/********************************************************************************
 函数名：datetimeFormat
 功能：格式化时间
 输入参数: datetime 时间
 format 格式化字符串 (yyyy/MM/dd hh:mm:ss)
 返回值：string 格式化后的字符串
 创建信息：谢建沅(2014-06-19)
 修改记录：黎萍（2014-06-25）修改变量名称；修改花括号的格式
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.datetimeFormat = function (datetime, format) {
    var date = {
        "M+": datetime.getMonth() + 1, //月份
        "d+": datetime.getDate(), //日
        "h+": datetime.getHours(), //小时
        "m+": datetime.getMinutes(), //分
        "s+": datetime.getSeconds(), //秒
        "q+": Math.floor((datetime.getMonth() + 3) / 3), //季度
        "S": datetime.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(format)) {
        format = format.replace(RegExp.$1, (datetime.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    for (var k in date) {
        if (new RegExp("(" + k + ")").test(format)) {
            format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (date[k]) : (('00' + date[k]).substr(('' + date[k]).length)));
        }
    }
    return format;
}

/********************************************************************************
 函数名：replaceHTML
 功能：剔除文本中的html代码
 输入参数: str 要处理的文本
 返回值：剔除后的字符串
 创建信息：谢建沅(2014-08-11)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.replaceHTML = function (str) {
    return str.replace(/<[^>].*?>/g,'');
}
/********************************************************************************
 函数名：shieldingWords
 功能：对录入的内容进行特殊字符屏蔽操作
 输入参数: str 要处理的文本
 返回值：剔除后的字符串
 创建信息：黎萍(2016-05-31)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.shieldingWords = function (str) {
    var strRegex = "((https|http|ftp|rtsp|mms)?://)"
        + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
        + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
        + "|" // 允许IP和DOMAIN（域名）
        + "([0-9a-z_!~*'()-]+\.)*" // 域名- www.
        + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名
        + "[a-z]{2,6})" // first level domain- .com or .museum
        + "(:[0-9]{1,4})?" // 端口- :80
        + "((/?)|" // a slash isn't required if there is no file name
        + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)";
    var reg = new RegExp(strRegex);
    //reg = reg +'ig';
    reg = /(http:\/\/|www\.)[\w-]*(\.[\w-]*)+/ig;
    str = str.replace(reg,'#');     //屏蔽网址
    str = str.replace(/<[^>].*?>/g,'#');        //屏蔽html代码
    str = str.replace(/(^\s+)|(\s+$)/g, '');    //去除前后空格
    str = str.replace(/[\ud83c-\udfff]/g, '#'); //屏蔽表情符
    return str;
}
/********************************************************************************
 函数名：checkVipApp
 功能：验证用户所选的科目是否购买
 输入参数: fn(isBuy) 回调函数 isBuy 是否购买
 返回值：无
 创建信息：谢建沅(2014-09-18)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.userAppMsg = {};//用户购买信息
yingSoftPre.prototype.checkVipApp = function () {
    var userName = G_Cookie.getUserName();
    var appEName = G_Cookie.getAppEName();
    var guid = G_Cookie.getGuid();
    var isBuy = false;
    var userID = G_Cookie.getUserID();
    if(!userID){
        return false;
    }
    var userAppKey = userID + '_' + appEName;
    if(userAppKey in this.userAppMsg){//之前获取过，直接从数组拿数据
        return this.userAppMsg[userAppKey];
    }
    var URL = '/api/user/vipinfo?appEName='+appEName+'&&guid='+guid;
    G_AjaxApi_Record.get(URL, false, function (json) {//json格式为：{ "data": { "userAppJson": userAppJson }, "msg": "找不到产品", "status": 201 } ;
        if (!json) {
            G_Prg.throw('程序运行错误:G_Prg._checkVipApp  请求服务器[/api/user/getVipMsg]接口无返回！');
        }
        var jsonData = JSON.parse(json);
        if (jsonData.status === 200) {
            isBuy = true;
        }else if (jsonData.status === 201) {
        }else if(jsonData.status === 300){
            //G_maiDian.setBugRecordInfos('程序错误','yingSoftPre封装文件——验证用户所选的科目是否购买',jsonData.status+':'+jsonData.msg);
            G_Prg.throw('程序运行错误:G_Prg._checkVipApp  服务器异常：status=' + jsonData.status + '，异常信息:' + jsonData.msg);
        } else if(jsonData.status >= 400 && jsonData.status < 500){
            //G_maiDian.setBugRecordInfos('业务逻辑错误','yingSoftPre封装文件——验证用户所选的科目是否购买',jsonData.status+':'+jsonData.msg);
            G_Prg.alert('登录信息失效，请您重新登录',function(){
            	window.location.href='/login';
            });
        } else{
            //G_maiDian.setBugRecordInfos('其它程序错误','yingSoftPre封装文件——验证用户所选的科目是否购买',jsonData.status+':'+jsonData.msg);
            G_Prg.throw('程序运行错误:G_Prg._checkVipApp  未知返回值：' + JSON.stringify(jsonData));
        }

    });
    this.userAppMsg[userAppKey] = isBuy;
    return isBuy;
}
/********************************************************************************
 函数名：getExamTime
 功能：获取当前用户当前科目的考试时间
 输入参数: userID 用户ID,appID 科目ID
 返回值：examTime 考试时间
 创建信息：韦友爱(2014-09-22)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.getExamTime = function (userID,appID) {
    var URL = '/api/examTimeApi/getExamTimeData/' + userID + '/' + appID + '/' + G_Cookie.getGuid()+'/'+G_Cookie.getUserName();
    var examTime = '';
    G_AjaxApi_Record.get(URL, false, function (json) {
        var jsonData = JSON.parse(json);
        if (jsonData.status === 200) {
            examTime = jsonData.data;
        } else if (jsonData.status === 201) {
            examTime = '';
        } else if(jsonData.status === 300){
            //G_maiDian.setBugRecordInfos('程序错误','yingSoftPre封装文件——当前科目考试时间',jsonData.status+':'+jsonData.msg);
            G_Prg.throw('程序运行错误:G_Prg.getExamTime,数据库连接错误');
        } else if(jsonData.status >= 400 && jsonData.status < 500){
            //G_maiDian.setBugRecordInfos('业务逻辑错误','yingSoftPre封装文件——当前科目考试时间',jsonData.status+':'+jsonData.msg);
            G_Prg.alert('参数错误');
        } else{
            //G_maiDian.setBugRecordInfos('其它程序错误','yingSoftPre封装文件——当前科目考试时间',jsonData.status+':'+jsonData.msg);
            G_Prg.throw('程序运行错误:G_Prg.getExamTime  未知返回值：' + JSON.stringify(jsonData));
        }
    });
    return examTime;
}
/********************************************************************************
 函数名：checkUserName
 功能：验证用户名格式
 输入参数: element 输入控件对象,isImmediately （可无）是否立即验证
 返回值：如果验证通过返回控制，否则返回对应的提示语
 创建信息：韦友爱(2014-10-15)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.checkUserName = function (element,isImmediately){
    var userName=element.value;
    if (!userName) {
        return '*请输入通行证';
    }
    var reg = /[^0-9]/g;
    if(userName.match(reg)){
        var index=this.getCursortPosition(element)-1;//获取光标位置
        element.value=userName.replace(reg, '');//将不合法字符过滤
        this.setCaretPosition(element, index);//指定光标位置
        return '';
        //return '*输入内容必须是数字';
    }
    if(!isImmediately){//非即时判断
        if(userName.length<11){
            return '*输入通行证为11位数';
        }
        if(!this.checkCellPhone(userName)){
            return '*通行证必须是手机号码';
        }
    }
    //即时判断
    if(userName.length===2){
        var phoneReg = /^(1[3,4,5,7,8])$/;
        if(!phoneReg.test(userName)){
            return '*通行证必须是手机号码';
        }
    }
    if(userName.length > 2){
        var name=userName[0]+userName[1];
        var phoneReg = /^(1[3,4,5,7,8])$/;
        if(!phoneReg.test(name)){
            return '*通行证必须是手机号码';
        }
    }
    if(userName.length > 10&&!this.checkCellPhone(userName)){
       return '*通行证必须是手机号码';
    }
    return '';
}
yingSoftPre.prototype.checkUserNameChange = function (element,isImmediately){
    var userName=element.val();
    if (!userName) {
        return '*请输入通行证';
    }
    var reg = /[^0-9]/g;
    if(userName.match(reg)){
        var index=this.getCursortPosition(element)-1;//获取光标位置
        element.val(userName.replace(reg, ''));//将不合法字符过滤
        this.setCaretPosition(element, index);//指定光标位置
        return '';
        //return '*输入内容必须是数字';
    }
    if(!isImmediately){//非即时判断
        if(userName.length<11){
            return '*输入通行证为11位数';
        }
        if(!this.checkCellPhone(userName)){
            return '*通行证必须是手机号码';
        }
    }
    //即时判断
    if(userName.length===2){
        var phoneReg = /^(1[3,4,5,7,8])$/;
        if(!phoneReg.test(userName)){
            return '*通行证必须是手机号码';
        }
    }
    if(userName.length > 2){
        var name=userName[0]+userName[1];
        var phoneReg = /^(1[3,4,5,7,8])$/;
        if(!phoneReg.test(name)){
            return '*通行证必须是手机号码';
        }
    }
    if(userName.length > 10&&!this.checkCellPhone(userName)){
       return '*通行证必须是手机号码';
    }
    return '';
}
// 验证码
yingSoftPre.prototype.checkUserNameViff = function (element,isImmediately){
    var userName=element.val();
    var reg = /[^0-9]/g;
    if(userName.match(reg)){
        var index=this.getCursortPosition(element)-1;//获取光标位置
        element.val(userName.replace(reg, ''));//将不合法字符过滤
        this.setCaretPosition(element, index);//指定光标位置
        return '';
        //return '*输入内容必须是数字';
    }
    return '';
}
/********************************************************************************
 函数名：checkPsw
 功能：验证密码格式
 输入参数: element 输入控件对象,isImmediately （可无）是否立即验证
 返回值：如果验证通过返回控制，否则返回对应的提示语
 创建信息：韦友爱(2014-10-15)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.checkPsw = function (element,isImmediately){
    var psw=element.val();
    if (!psw) {
        return '*请输入密码';
    }
    var markWord='*密码必须是6-20个字符';
    var reg = /[^0-9a-zA-Z`~!@#$%^&*()_+<>?:{\},.\/;[\]\\\|\'\"-=]/g;
    if(psw.match(reg)) {
        var index=this.getCursortPosition(element)-1;//获取光标位置
        element.value=psw.replace(reg, '');
        this.setCaretPosition(element, index);//光标定位
        return '';
//        return markWord;
    }
    if(!isImmediately){
        if(psw.length<6||psw.length>20){
            return markWord;
        }
    }
    if(psw.length>20){
        return markWord;
    }
    return '';
}
/********************************************************************************
 函数名：getCursortPosition
 功能：获取光标位置索引
 输入参数: element 输入控件对象
 返回值：CaretPos 光标位置索引
 创建信息：韦友爱(2014-10-15)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.getCursortPosition = function(element) {
    var CaretPos = 0
    var length = 0;
    if(window.getSelection){
        length=window.getSelection().toString().length;
    }else if(document.selection&&document.selection.createRange){
        length=document.selection.createRange().text.length;
    }
    if (document.selection) {
        element.focus ();
        var Sel = document.selection.createRange ();
        Sel.moveStart ('character', - element.value.length);
        CaretPos = Sel.text.length;
    }else if (element.selectionStart || element.selectionStart == '0'){
        CaretPos = element.selectionStart;
    }
    return (CaretPos+length);

}
/********************************************************************************
 函数名：setCaretPosition
 功能：指定光标位置
 输入参数: element 输入控件对象，position 光标位置索引
 返回值：无
 创建信息：韦友爱(2014-10-15)
 修改记录：无
 审查人：无
 *******************************************************************************/
yingSoftPre.prototype.setCaretPosition = function(element, position){
    if(element.setSelectionRange){
        element.focus();
        element.setSelectionRange(position,position);
    }else if (element.createTextRange) {
        var range = element.createTextRange();
        range.collapse(true);
        range.moveEnd('character', position);
        range.moveStart('character', position);
        range.select();
    }
}
/********************************************************************************
 函数名：alert(必须引用dialog.css和dialog.js)
 功能：自定义弹出框
 输入参数: msg 提示信息
 callback 点击后执行的函数(可选参数)
 返回值：无
 创建信息：黎萍（2014-05-20）
 修改记录：谢建沅（2014-06-13）封装弹出窗口
 修改记录：谢建沅（2014-06-18）添加回调函数
 修改记录：韦友爱（2014-10-23）添加是否有报错弹窗的判断
 审查人：韦友爱（2010-05-26）
 审查人：黎萍（2014-06-24）
 *******************************************************************************/
yingSoftPre.prototype.showNotice = function (msg, callback,titleMsg,btnMsg) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
        var btn = '知道了';
        var title = '公告';
        if(btnMsg){
            btn=btnMsg;
        }
        G_DialogBox.showNotice(msg, callback,titleMsg,btnMsg);
        /*
        if (callback) {
            G_DialogBox.show({ buttons: { yes: '知道了' }, width: '300px', msg: '<div style="text-align:left;text-indent:2em;">'+msg+'</div>', title: '考试宝典平台维护公告', fn: function (btn) {
                if (btn === 'yes') {
                    callback();
                }
            } });
            /*G_Prg.$('nrdvMsgCT').style.textAlign='left';
            G_Prg.$('nrdvMsgCT').style.textIndent='2em';*/
       /* } else {
            G_DialogBox.showNotice(msg);
        }*/
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
}
yingSoftPre.prototype.showLast = function (msg, yesCallback, noCallback) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
         G_DialogBox.showLast(msg, function (btn) {
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback();
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
};
yingSoftPre.prototype.showBuyingTip = function (msg, yesCallback, noCallback) {
    try {
        var eerorBox = document.getElementById('nrdvMsgBox');
        if(eerorBox && eerorBox.style.display === 'block'){//判断是否有报错弹窗（被踢下线）
            return;
        }
         G_DialogBox.showBuyingTip(msg, function (btn) {
            if (btn === 'yes') {
                if(yesCallback){
                    yesCallback();
                }
            } else {
                if (noCallback) {
                    noCallback();
                }
            }
        });
    } catch (err) {
        alert(err);
        throw new Error(err);
    }
};
/********************************************************************************
功能：检测用户购买的功能权限模块（建筑系列视频权限检验）
输入参数: 功能权限模块名称，参数顺序不可乱：purviewName1 精品通关课程, purviewName2 特惠基础课程
返回值：buyType 用户购买的功能权限模块代码，1-3表示用户购买了单个的功能权限模块，
        4表示用户购买了组合套餐
最后修改人：黎萍（2015-12-29）
修改记录：无
********************************************************************************/
yingSoftPre.prototype.checkApiPurview_JZ = function (purviewName1, purviewName2) {
    var data = G_Storage.getSessionStorageValue('ApiPurview');
    if (_isEmpty(data)) {
        return;
    }
    var buyType = 0;
    var arrLen = data.length;
    for (var i = 0; i < arrLen; i++) {
        if (data[i].BuyType.indexOf(purviewName1) >= 0 && purviewName1) {
            buyType = 1;
            return buyType;
        }
        if (data[i].BuyType.indexOf(purviewName2) >= 0 && purviewName2) {
            buyType = 2;
            return buyType;
        }
    }
    function _isEmpty(obj) {
        for (var name in obj)  {
            return false;
        }
        return true;
    };
}
/********************************************************************************
功能：检测用户购买的功能权限模块(医药系列视频权限检验)
输入参数: 功能权限模块名称，参数顺序不可乱：purviewName1 精品课程, purviewName2 易混易错, purviewName3 考前预测,purviewName4 实践技能
返回值：buyType 用户购买的功能权限模块代码，1-3表示用户购买了单个的功能权限模块，
        4表示用户购买了组合套餐
最后修改人：黎萍（2015-05-12）
修改记录：黎萍（2015-07-02）对组合价类型类似"易混易错+考前预测"进行分割处理
          黎萍（2015-07-30）增加课程实践技能访问权限控制
********************************************************************************/
yingSoftPre.prototype.checkApiPurview = function (purviewName1, purviewName2, purviewName3,purviewName4) {
    var data = G_Storage.getSessionStorageValue('ApiPurview');
    if (_isEmpty(data)) {
        return;
    }
    var buyType = 0;
    var arrLen = 0;
    var tempLen = 0;

    if(G_Cookie.getAppEName() === 'ZY_ZYAO' || G_Cookie.getAppEName() === 'ZY_XY'){
        buyType = 3;
        return buyType;
    }
    for(var i = 0; i < data.length; i++){
        tempLen = data[i].BuyType.split('+').length;//data.length;
        if(tempLen > arrLen){
            arrLen = tempLen;
        }
    }
    if(data.length >= arrLen){
        arrLen = data.length;
    }
    if (arrLen === 1) {
        if (data[0].BuyType === purviewName1) {
            buyType = 1;
        }
        if (data[0].BuyType === purviewName2) {
            buyType = 2;
        }
        if (data[0].BuyType === purviewName3) {
            buyType = 3;
        }
        if (data[0].BuyType === purviewName4) {
            buyType = 5;
        }
    } else {
        for (var i = 0; i < arrLen; i++) {
            if (data[i].BuyType === purviewName1 || data[i].BuyType === purviewName2 || data[i].BuyType === purviewName3) {
                buyType = 4;
            }
        }
    }
    return buyType;
    function _isEmpty(obj) {
        for (var name in obj)  {
            return false;
        }
        return true;
    };
}

/********************************************************************************
函数名：iOSfn
功能：苹果商店功能
输入参数: 无
返回值：包含用户名、软件英文名、软件中文名的字符串
创建信息：韦友爱（2015-07-16）
修改记录：无
审查人：无
*******************************************************************************/
function iOSfn() {
    var username = G_Cookie.getUserID();
    var softname = G_Cookie.getAppEName();
    var appName = G_Cookie.getAppName();
    var userID = G_Cookie.getUserName();
    var appID = G_Cookie.getAppID();
    var isbuy = G_Prg.checkVipApp() ? 1 : 0;
    var cookie = G_Cookie.getGuid();
    var AgentNo = G_AgentInfo.getAgentCode();
    var vn = 0 ;
    var configJson = {};
    if(!G_Storage.checkSessionStorageSupport()){
        var configJson = G_Prg.getCookie('AppVerOperJSON');
        verno=configJson===null?configJson.VerNO:configJson.VerNO;
    }else{
        var configJson = G_Storage.getSessionStorageValue('AppVerOperJSON');
        if(configJson){
            verno=configJson===null?configJson.VerNO:configJson.VerNO;
        }
    }
    if (configJson) {
        vn = configJson.VerNO;
    }
    var answer = username + "/" + softname + "/" + appName + "/" + userID + "/" + isbuy + '/' + vn + '/' + appID+'/'+cookie+'/'+AgentNo;
    return answer;
}

//匿名函数返回一个对象
var G_ChapterCache = (function () {
    //定义函数开始
    var chapterCache = function () {
        var _cacheData = null;//用来存储章节缓存数据
        //从localStorage获取缓存
        function getChapterCache (){
            var appID = G_Cookie.getAppID();
            var userID = G_Cookie.getUserID();
            var guid = G_Cookie.getGuid();
            //判断科目、用户
            if(!appID||!userID||!guid){
                return null;
            }
            var cacheKey =  'chapterCache_' + appID + '_' +userID;
            var cacheData = '';
            //先从判断_cacheData变量中是否存有数据
            if(_cacheData !== null){
                return _cacheData;
            }
            //不支持缓存的，不做任何操作
            if(!window.localStorage){
                return;
            }
            //从缓存拿数据
            cacheData = JSON.parse(localStorage.getItem(cacheKey));
            //缓存中有数据，返回数据
            if(cacheData){
                _cacheData = cacheData;
                return cacheData;
            }
            //缓存无数据，从接口获取数据
            var url = '/api/chapterMenu/getCptStatistics?appID=' + appID + '&guid=' + G_Cookie.getGuid();
            G_AjaxApi_Record.get(url, false, function (json) {
                var jsonData = JSON.parse(json);
                if (jsonData.status === 200 || jsonData.status === 201) {
                    cacheData = jsonData.data;
                }else if(jsonData.status === 300){
                    //G_maiDian.setBugRecordInfos('程序错误','yingSoftPre封装文件——获取新章节',jsonData.status+':'+jsonData.msg);
                } else if(jsonData.status >= 400 && jsonData.status < 500){
                    //G_maiDian.setBugRecordInfos('业务逻辑错误','yingSoftPre封装文件——获取新章节',jsonData.status+':'+jsonData.msg);
                } else{
                    //G_maiDian.setBugRecordInfos('其它程序错误','yingSoftPre封装文件——获取新章节',jsonData.status+':'+jsonData.msg);
                }
            });
            //将数据进行缓存
            _cacheData = cacheData;
            setChapterCache(cacheKey,cacheData);
            return cacheData;
        }
        //异步获取数据,防止做题界面卡死
        function asyncGetCache (callBack){
            var appID = G_Cookie.getAppID();
            var userID = G_Cookie.getUserID();
            var guid = G_Cookie.getGuid();
            //判断科目、用户
            if(!appID||!userID||!guid){
                return;
            }
            var cacheKey = 'chapterCache_' + appID + '_' +userID;
            var cacheData = '';
            //先从判断_cacheData变量中是否存有数据
            if(_cacheData !== null){
                callBack(_cacheData);
                return;
            }
            //不支持缓存的，不做任何操作
            if(!window.localStorage){
                return;
            }
            //从缓存拿数据
            cacheData = JSON.parse(localStorage.getItem(cacheKey));
            //缓存中有数据，返回数据
            if(cacheData){
                _cacheData = cacheData;
                callBack(_cacheData);
                return;
            }
            //无缓存，不做任何操作[缓存中如果没有数据，最终进章节列表还是会从接口获取数据，所以现在没有必要获取数据]
            return;
            //缓存无数据，从接口获取数据
            var url = '/api/chapterMenu/getCptStatistics?appID=' + appID + '&guid=' + G_Cookie.getGuid();
            G_AjaxApi_Record.get(url, true, function (json) {
                var jsonData = JSON.parse(json);
                if (jsonData.status === 200 || jsonData.status === 201) {
                    cacheData = jsonData.data;
                    _cacheData = cacheData;
                    callBack(_cacheData);
                }else if(jsonData.status === 300){
                    //G_maiDian.setBugRecordInfos('程序错误','yingSoftPre封装文件——获取新章节2',jsonData.status+':'+jsonData.msg);
                } else if(jsonData.status >= 400 && jsonData.status < 500){
                    //G_maiDian.setBugRecordInfos('业务逻辑错误','yingSoftPre封装文件——获取新章节2',jsonData.status+':'+jsonData.msg);
                } else{
                    //G_maiDian.setBugRecordInfos('其它程序错误','yingSoftPre封装文件——获取新章节2',jsonData.status+':'+jsonData.msg);
                }
            });
        }
        //将数据缓存到localStorage
        function setChapterCache (cacheKey,cacheData){
            if(window.localStorage){
                localStorage.setItem(cacheKey, JSON.stringify(cacheData));
            }
        }
        //对外暴露获取章节缓存数据的方法
        this.getChapterInfo = function(){
            return getChapterCache();
        };
        //修改指定章节的已答数量
        this.setCptIDInfo = function(cptID,infoData){
            if(!cptID || !infoData){
                return;
            }
            var appID = G_Cookie.getAppID();
            var userID = G_Cookie.getUserID();
            //判断科目、用户
            if(!appID||!userID){
                return;
            }
            var cacheKey = 'chapterCache_' + appID + '_' +userID;
            var testCount = !infoData.testCount ? 0:infoData.testCount;
            var rightCount = !infoData.rightCount ? 0:infoData.rightCount;
            if(!testCount&&!rightCount){
                return;
            }
            var isFindCptID = false;//是否匹配到当前章节ID
            var callBack = function(chapterCache){
                if(!chapterCache||!chapterCache.length){
                    chapterCache = [{
                        "CptID":cptID,
                        "testCount":testCount< 0 ? 0:testCount,
                        "RightCount":rightCount< 0 ? 0:rightCount
                    }];
                    setChapterCache(cacheKey,chapterCache);
                    return;
                }
                for(var i=0;i<chapterCache.length;i++){
                    var curCptID = chapterCache[i].CptID;
                    var curTestCount = chapterCache[i].testCount;
                    var curRightCount = chapterCache[i].RightCount;
                    if(curCptID===cptID){
                        isFindCptID = true;
                        curTestCount = curTestCount + testCount;
                        curRightCount = curRightCount + rightCount;
                        chapterCache[i].testCount = curTestCount < 0 ? 0:curTestCount;
                        chapterCache[i].RightCount = curRightCount < 0 ? 0:curRightCount;
                        break;
                    }
                }
                if(!isFindCptID){//未匹配到章节
                    var cptInfo = {
                        "CptID":cptID,
                        "testCount":testCount< 0 ? 0:testCount,
                        "RightCount":rightCount< 0 ? 0:rightCount
                    };
                    chapterCache.push(cptInfo);
                }
                //更新数据到缓存
                setChapterCache(cacheKey,chapterCache);
            }
            asyncGetCache(callBack);
        };
        //清空指定章节的已答、答对数量
        this.removeCptIDInfo = function (cptID){
            if(!cptID){
                return;
            }
            var appID = G_Cookie.getAppID();
            var userID = G_Cookie.getUserID();
            //判断科目、用户
            if(!appID||!userID){
                return;
            }
            var cacheKey = 'chapterCache_' + appID + '_' +userID;
            var isFindCptID = false;//是否匹配到当前章节ID
            var callBack = function(chapterCache){
                if(!chapterCache||!chapterCache.length){
                    return;
                }
                for(var i=0;i<chapterCache.length;i++){
                    var curCptID = chapterCache[i].CptID;
                    if(curCptID===cptID){
                        isFindCptID = true;
                        chapterCache[i].testCount = 0;
                        chapterCache[i].RightCount = 0;
                        break;
                    }
                }
                //更新数据到缓存
                if(isFindCptID){
                    setChapterCache(cacheKey,chapterCache);
                }
            }
            asyncGetCache(callBack);
        }

    }; //函数定义结束
    return new chapterCache();
})();

//缓存用户答题数据info包
var G_UserInfoCache = (function(){
    var _userInfoCache = new Object();  //存储用户答题info包所在的伪哈希表
    //定义函数对象
    var userInfoCache = function(){
        function isEmpty(obj) {
            for(var name in obj){
                return false;
            }
            return true;
        };
        /********************************************************************************
         功能：设置保存当前章节用户答题info包到localStorage
         输入参数: cacheKey 当前章节的info包在localStorage缓存的键，cacheValue 当前章节的用户答题info包
         返回值：无
         最后修改人：黎萍（2016-4-12）
         修改内容：无
         ********************************************************************************/
        function setInfoCache(cacheKey,cacheValue){
            var appID = G_Cookie.getAppID();
            var userID = G_Cookie.getUserID();
            //判断科目、用户
            if(!appID||!userID){
                return null;
            }
            //不支持缓存的，不做任何操作
            if(!window.localStorage){
                return;
            }
            //从缓存拿数据
            //_userInfoCache = JSON.parse(localStorage.getItem('userTestInfo_'+appID + '_' +userID));

            //先判断当前要保存的info包数据的键之前是否已经存在
            /*if(_userInfoCache.hasOwnProperty(cacheKey)){  //存在，修改该键下的值
                _userInfoCache[cacheKey] = JSON.stringify(cacheValue);
            }else{  //不存在，新增键值*/
                //新增前，判断当前哈希表里的数量是否超过了10个
                var count = getKeys().length;
                if(count === 5){
                    //移除第一个哈希表对象
                    delete _userInfoCache[getKeys()[0]];
                }
                _userInfoCache[cacheKey] = JSON.stringify(cacheValue);
            //}
            if(window.localStorage){
                localStorage.setItem('userTestInfo_'+appID + '_' +userID, JSON.stringify(_userInfoCache));
            }
        }
        /********************************************************************************
         功能：获取当前章节缓存的用户答题info包
         输入参数: cacheKey 当info包在localStorage缓存的键（章节id）
         返回值：当前章节的用户答题info包
         最后修改人：黎萍（2016-4-12）
         修改内容：无
         ********************************************************************************/
        function getInfoCache(cacheKey){
            var appID = G_Cookie.getAppID();
            var userID = G_Cookie.getUserID();
            var userName = G_Cookie.getUserName();
            var guid = G_Cookie.getGuid();  //检验码
            var cptID = cacheKey;
            //判断科目、用户
            if(!appID || !userID || !guid || !cptID){
                return;
            }
            //先从判断_cacheData变量中是否存有数据
            if(!isEmpty(_userInfoCache)){
                return _userInfoCache[cptID];
            }
            //不支持缓存的，不做任何操作
            if(!window.localStorage){
                return;
            }
            //从缓存拿数据
            var cacheData = JSON.parse(localStorage.getItem('userTestInfo_'+appID + '_' +userID));
            //缓存中有数据，返回数据
            if(cacheData){
                _userInfoCache = cacheData;
                if(cacheData.hasOwnProperty(cptID)){
                    return cacheData[cptID];
                }
            }
            var params={
                appID : appID,
                cptID : cptID,
                userID : userID,
                userName : userName,
                guid : guid
            };
            var userInfo = [];
            //缓存无数据，从接口获取数据
            var success=function(json){
                var jsonObj = JSON.parse(json);
                if (jsonObj.status === 200) {
                    userInfo = jsonObj.data.info;
                }else if(jsonObj.status === 300){
                    //G_maiDian.setBugRecordInfos('程序错误','yingSoftPre封装文件——获取用户做题数据info包',jsonObj.status+':'+jsonObj.msg);
                } else if(jsonObj.status >= 400 && jsonObj.status < 500){
                    //G_maiDian.setBugRecordInfos('业务逻辑错误','yingSoftPre封装文件——获取用户做题数据info包',jsonObj.status+':'+jsonObj.msg);
                } else{
                    //G_maiDian.setBugRecordInfos('其它程序错误','yingSoftPre封装文件——获取用户做题数据info包',jsonObj.status+':'+jsonObj.msg);
                }
            };
            G_AjaxApi_Record.post('/api/exam/getChapterTestInfo',params,false,success);
            setInfoCache(cptID,userInfo);
            return JSON.stringify(userInfo);
        }
        //获取哈希表中的所有键
        function getKeys(){
            var keys = [];
            for(var prop in _userInfoCache){
                keys.push(prop);
            }
            return keys;
        }
        //保存用户答题info包
        this.setUserInfoCache = function(cacheKey,cacheValue){
            setInfoCache(cacheKey,cacheValue);
        };

        //获取用户答题info包
        this.getUserInfoCache = function(cacheKey){
            return getInfoCache(cacheKey);
        };

        //移除指定章节下本地缓存的用户答题info包，只清除答题记录，收藏、笔记等信息保留
        this.removeUserInfoCache = function(cacheKey){
            var infoData = JSON.parse(getInfoCache(cacheKey));
            if(!infoData){
                return;
            }
            var dataLen = infoData.length;
            for(var i = 0; i < dataLen;i++){
                infoData[i].IsRight = false;
                infoData[i].UserAnswer = '';
                infoData[i].State = 'uncommited';
                infoData[i].LastReplyTime = '';
            }
            return infoData;
            //delete _userInfoCache[cacheKey];
        };
        //删除、修改试题用户笔记
        this.updateUserNoteCache = function(cacheKey,allTestID,subTestID,noteContext){
            var infoData = JSON.parse(getInfoCache(cacheKey));
            if(!infoData){
                return;
            }
            var dataLen = infoData.length;
            for(var i = 0; i < dataLen;i++){
                if(infoData[i].AllTestID === allTestID && infoData[i].ChildTableID === subTestID){
                    if(noteContext){
                        infoData[i].UserNote = noteContext;
                        infoData[i].NoteTime = G_Prg.datetimeFormat(new Date(), 'yyyy-MM-dd');
                    }else{
                        infoData[i].UserNote = '';
                        infoData[i].NoteTime = G_Prg.datetimeFormat(new Date(), 'yyyy-MM-dd');
                    }
                    setInfoCache(cacheKey,infoData);
                    break;
                }
            }
        };
    };  //函数结束
    return new userInfoCache(); //实例化函数
})();
/********************************************************************************
 功能：判断是否是社区化科目
 输入参数: appEname 科目英文名称
 返回值：true  社区化科目   false 不属于社区化科目
 最后修改人：颜鹏（2016-4-19）
 修改内容：无
 ********************************************************************************/
var G_SQH_New = (function(){
    var check_name = function(){
    this.checktype =function(appEname){
        var SQH_appEname=["CJ_JJXS", "CJ_QHCY", "ZY_LC", "ZY_LC_ZL","ZY_KQ" ,
            "ZY_KQ_ZL", "ZY_ZYI", "ZY_ZYI_ZL", "ZY_ZXY", "ZY_ZXY_ZL", "ZY_GW","ZY_GW_ZL"];
        for(i=0;i<SQH_appEname.length;i++){
            if(appEname === SQH_appEname[i]){
                //如果是社区化科目，就跳转到社区化页面
                //window.location.href = 'shequ.ksbao.com';
                return true;
            }
        }
        //window.location.href = 'http://new.ksbao.com';
        return false;
    };
    };
    return new check_name();
})();